package com.ss.plugins.ws.collect.api.impl;


import com.ss.plugins.ws.collect.api.WsSessionList;
import com.ss.plugins.ws.collect.model.SessionBean;
import lombok.extern.slf4j.Slf4j;

import javax.websocket.Session;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * 单页面不能重复添加的SessionList
 * @author xia17
 * @date 2019/6/1 14:54
 */
@Slf4j
public class AloneSessionList<T extends SessionBean> implements WsSessionList<T> {

    /**
     *  存储Session的容器
     */
    private final LinkedList<T> sessions =  new LinkedList<>();


    /**
     * 判断是否包含这个
     * @param sessionBean 存储Session的对象
     * @return 包含true
     */
    @Override
    public synchronized boolean contain(T sessionBean) {
        return this.sessions.stream().anyMatch(sessionBean::myEquals);
    }

    /**
     * 添加一个
     * @param aloneSessionBean 存储Session的对象
     * @return 成功true
     */
    @Override
    public synchronized boolean add(T aloneSessionBean) {
        if (aloneSessionBean == null){
            log.error("添加失败");
            log.error("不能将为null的对象加入Xia17Session容器");
            return false;
        }
        if (aloneSessionBean.getSession() == null){
            log.error("添加失败");
            log.error("SessionBean对象里的SocketSession不能为空");
            return false;
        }
        //判断重复
        if (!contain(aloneSessionBean)){
            sessions.add(aloneSessionBean);
            return true;
        }
        log.error("该唯一标识已经存在");
        return false;
    }

    /**
     * 移除一个Session,
     * @param sessionBean 存储Session的对象
     * @return 成功返回true
     */
    @Override
    public synchronized boolean remove(T sessionBean) {
        Optional<T> optional = this.getSessionBean(sessionBean);;
        if (optional.isPresent()){
            this.sessions.remove(optional.get());
            return true;
        }
        log.error("未在集合中找到对应的sessionBean");
        return false;
    }

    /**
     * 通过Session移除
     * @param session Websocket 的Session
     * @return 成功返回true
     */
    @Override
    public synchronized boolean remove(Session session) {
        Optional<T> sessionBean = this.getSessionBean(session);
        if (sessionBean.isPresent()){
            this.remove(sessionBean.get());
            return true;
        }
        return false;
    }

    /**
     * 获取客户端数量
     * @return 存储了多少个
     */
    @Override
    public int clientSize() {
        return this.sessions.size();
    }

    /**
     * 获取session数量
     * @return （与clientSize 返回一致）
     */
    @Override
    public int sessionSize() {
        return this.sessions.size();
    }


    /**
     * 获取所有Session
     * @return 获取所有的Session
     */
    @Override
    public List<Session> getAllSession() {
        return this.sessions.stream().map(SessionBean::getSession).collect(Collectors.toList());
    }

    /**
     * 获取一个Session
     * @param sessionBean  条件
     * @return 返回一个
     */
    @Override
    public List<Session> getSession(T sessionBean) {
        ArrayList<Session> list = new ArrayList<>(1);
        this.getSessionBean(sessionBean).ifPresent(e->list.add(e.getSession()));
        return list;
    }

    /**
     * 根据Ws 的 session 获取一个包装session的Bean（带有自己数据的）
     * @param session  Ws 的 session
     * @return 不存在返回null
     */
    @Override
    public Optional<T> getSessionBean(Session session) {
        return this.sessions.stream().filter(e->e.getSession().getId().equals(session.getId())).findAny();
    }

    /**
     * 多页面使用
     * @param sessionBean  自定义的sessionBean
     * @return 抛出异常
     */
    @Deprecated
    @Override
    public List<T> getSessionBeanList(T sessionBean) {
        throw new RuntimeException("单页面未实现此方法,请使用getSessionBean()");
    }

    /**
     * 根据SessionBean 获取SessionBean数据
     * @param sessionBean 自定义的sessionBean
     * @return 返回一个Object ,单页面是个对象
     */
    @Override
    public Optional<T> getSessionBean(SessionBean sessionBean){
        return this.sessions.stream().filter(sessionBean::myEquals).findAny();
    }


}
